構成管理を意識したRDSのDBパラメータグループの更新作法
こんにちは、虎塚です。
今回は、RDSの設定値を変更する際に、構成管理の観点から考えて採用している方法を紹介します。
RDSの設定値変更時の管理対象
データベースの設定値を管理するにあたって、次のような要求が考えられます。
- 変更の実施前の状態と実施後の結果を管理したい
- 実施した変更内容を管理したい
- 変更前後の内容の差分から変更を推測するのではなく、「どのような変更をおこなったか」を特定したい
RDSの設定値は、DB パラメータグループの更新によって変更します。そのため、上の要求を満たすためには、次の要素を管理対象にするとよいでしょう。
- 1を満たすために必要なもの(変更の前後で保存)
- DBパラメータグループの値
- DBに実際に設定されている値
- 2を満たすために必要なもの
- DBパラメータグループ更新時のコマンド
- 管理上必要なメタな情報
- 変更実施日時、変更実施者名、変更要求とのトレーサビリティを確保するための課題管理番号など
3はプロジェクトで採用している変更管理手順や構成管理手順によって異なりますので、この記事では1と2だけを扱います。
1のDBパラメータグループの値には、DBに実際に設定されている値の一部が含まれない場合があることに注意してください。DBパラメータグループで「endgine-default」になっている値には、明示的に設定値を与えないかぎり、DBインスタンスのスペックに応じて自動的に調整された値が設定されます。
そのため、DBパラメータグループの内容と、DBに実際に設定されている値の両方を、構成管理の対象にします。
暗黙に設定されている値を管理しておくことで、RDSの仕様上の設定が変わったときに、DBの動作の変化を把握する手がかりになるでしょう。
設定変更の手順
DBパラメータの設定変更は、次の手順でおこないます。
- 変更前のDBパラメータグループの確認
- 変更前のDB設定値の確認
- DBパラメータグループの変更
- 変更後のDBパラメータグループの確認
- 変更後のDB設定値の確認
1. 変更前のDBパラメータグループの確認
DBインスタンスに現在適用しているDBパラメータグループの内容を保存します。
まず、対象のインスタンス (my-db-insntance) に適用しているDBパラメータグループ名を特定します。
$ aws rds describe-db-instances | jq '.DBInstances[] | if .DBInstanceIdentifier == "my-db-insntance" then .DBParameterGroups[].DBParameterGroupName else empty end' "my-postgres-9-4-ja"
次に、DBパラメータグループ (my-postgres-9-4-ja) の内容を取得し、テキストファイルに保存します。
$ aws rds describe-db-parameters --db-parameter-group-name my-postgres-9-4-ja > my-postgres-9-4-ja.bak
$ cat my-postgres-9-4-ja.bak { "Parameters": [ { "ApplyMethod": "pending-reboot", "Description": "Sets the application name to be reported in statistics and logs.", "DataType": "string", "Source": "engine-default", "IsModifiable": true, "ParameterName": "application_name", "ApplyType": "dynamic" }, [...]
2. 変更前のDB設定値の確認
DBインスタンスに実際に設定されている値を確認し、保存します。先ほど述べたとおり、DBパラメータグループの各パラメータで、キー「Source」の値が「engine-default」となっている場合は、自動で調整された設定値が入っています。
具体的な設定値の参照方法は、DBMSの種類ごとに異なりますので、それぞれ簡単に説明します。
PostgreSQL
PostgreSQLクライアントでインスタンスに接続し、pg_settingsテーブルの値を取得してファイルに保存します。
$ psql -d my-db-name -h my-instance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -U USER_NAME -c 'SELECT name,setting,unit FROM pg_settings;' -A -F $'\t' > postgre_parameters.bak
PostgreSQLインスタンスから取得した設定値の例を、次に示します。
$ head postgre_parameters.bak name setting unit allow_system_table_mods off application_name psql archive_command /etc/rds/dbbin/pgscripts/rds_wal_archive %p archive_mode on archive_timeout 300 s [...]
MySQL、MariaDB、Aurora
RDS for MySQL、RDS for MariaDB、Amazon Auroraインスタンスへ接続するには、MySQLクライアントを使用します。
次のコマンドでインスタンスに接続し、show variablesコマンドを実行して、結果をファイルに保存します。
mysql -h my-instance.abcdef123456.ap-northeast-1.rds.amazonaws.com -u user-name -D table-name -p -e 'show variables;' > maria_paramters.txt
MariaDBインスタンスから取得した設定値の例を、次に示します。
$ head maria_parameters.txt Variable_name Value aria_block_size 8192 aria_checkpoint_interval 30 aria_checkpoint_log_activity 1048576 aria_force_start_after_recovery_failures 0 aria_group_commit none [...]
Oracle
RDS for Oracleへ簡単に接続するには、sqlplusを使用します。
Oracleの初期化パラメータを次のコマンドで確認します。spoolを使うことで、SQL*Plus上で実行したコマンドの結果をファイルに保存できます。
$ sqlplus username/password@my-instance.abcdef123456.ap-northeast-1.rds.amazonaws.com:1521/service-name [...] SQL> spool oracle_parameters.log SQL> show PARAMETERS
Oracleのインスタンスから取得した設定値の例を、次に示します。
$ head oracle_parameters.log SQL> show PARAMETERS NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ O7_DICTIONARY_ACCESSIBILITY boolean FALSE active_instance_count integer aq_tm_processes integer 1 archive_lag_target integer 300 asm_diskgroups string [...]
SQL Server
まず、RDS for SQL Serverのインスタンスに接続します。接続には、WindowsクライアントにSQL Server Management Studioをインストールして使用します。参考までに、Windows Server 2012にSQL Server Management Studioをインストールした場合は、C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\ディレクトリにあるSsms.exeをダブルクリックすることで起動できます。
次に、ツールバー[クエリ]→[結果の出力]→[結果をファイルに出力]を選択します。初期状態では、[結果をグリッドに表示]になっています。
最後に、[新しいクエリ]ボタンを押して、開いたペインに次のクエリを入力し、[実行]ボタンを押します。
USE rdsadmin; GO SELECT name, description, is_advanced FROM sys.configurations ; GO
[結果の保存]ダイアログから、任意のファイル名 (mssqlserver_parameters.rpt) で保存します。
SQL Serverインスタンスから取得した設定値の例を、次に示します。拡張子rptはテキストファイルです。
$ head mssqlserver_parameters.rpt name description is_advanced ----------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- recovery interval (min) Maximum recovery interval in minutes 1 allow updates Allow updates to system tables 0 user connections Number of user connections allowed 1 locks Number of locks for all users 1 open objects Number of open database objects 1 [...]
3. DBパラメータグループの変更
このステップでようやく変更を実施します。
ところで、DBパラメータグループを変更するために使用する ModifyDBParameterGroup API には、1回のリクエストで変更できるパラメータは20個までという制約があります。制約を超えるリクエストをAWS CLIで送信すると、次のエラーになります。
A client error (InvalidParameterCombination) occurred when calling the ModifyDBParameterGroup operation: Cannot modify more than 20 parameters in a single request
しかし、ある特定のタイミングに実施する変更を複数のファイルに分割すると、変更の意図が分かりづらくなります。また、複数のファイルを管理するのは単純に面倒です。
そこで、AWS CLIとjqコマンドを使って、変更内容を1つのファイルにまとめつつ、制約にかからないように部分適用しましょう。
例として、RDS for PostgreSQLに適用しているDBパラメータグループに、20個以上の変更を加えることにします。
変更内容をまとめたJSONファイル (my-postgres-9-4-ja_20160115.json) を作成します。途中を省略しますが、変更項目は20個以上あると思ってください。
$ cat my-postgres-9-4-ja_20160115.json { "DBParameterGroupName": "my-postgres-9-4", "Parameters": [ { "Description": "Sets the message levels that are sent to the client.", "DataType": "string", "AllowedValues": "debug5,debug4,debug3,debug2,debug1,log,notice,warning,error", "Source": "engine-default", "IsModifiable": true, "ParameterValue": "notice", "ParameterName": "client_min_messages", "ApplyType": "dynamic", "ApplyMethod": "immediate" }, { "Description": "Indents parse and plan tree displays.", "DataType": "boolean", "AllowedValues": "0,1", "Source": "engine-default", "IsModifiable": true, "ParameterValue": "1", "ParameterName": "debug_pretty_print", "ApplyType": "dynamic", "ApplyMethod": "immediate" }, [...]
1個目から20個目までの項目(インデックス0〜19の要素)を適用するには、次のコマンドを実行します。jqのindexと、xargsコマンドを使う点がポイントです。
$ cat my-postgres-9-4-ja_20160115.json | jq '.Parameters[0:20]' | xargs -0 aws rds modify-db-parameter-group --db-parameter-group-name my-postgres-9-4-ja --parameters
あとは、[20:30], [30:40]...というように、インデックスを変更しながら、必要なだけ繰り返し適用します。jqのインデックス値を手で変更しながら実行したくない場合は、インデックス部分を変数化してスクリプトにしてください。
これで、DBパラメータグループの変更内容を1つのファイルにまとめることができます。
4. 変更後のDBパラメータグループの確認
ステップ1の手順で、設定変更後のDBパラメータグループをあらためて取得し、ファイルに保存します。
5. 変更後のDB設定値の確認
ステップ2の手順で、設定変更後にDBに適用されている実際の値を取得し、ファイルに保存します。
以上で完了です。
おわりに
組織のビジネスで重要な役割を持つシステムでは、あらかじめ変更管理や構成管理の手順を定義することと、日々の開発運用でそれを守ることが、システムの安定稼働につながります。インフラの設定変更、たとえばRDSの設定変更も例外ではありません。今回は、そのための手順の例をご紹介しました。
それでは、また。